#!/usr/bin/env python
# -*- coding: utf-8 -*-



from selenium import webdriver
from selenium.common.exceptions import TimeoutException  # 超时防错机制
from selenium.webdriver.common.by import By  # 定位元素用的   可用CSS中的select器
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.support.ui import WebDriverWait  # 等待 网页转圈圈
from urllib.parse import quote  # 将汉字转码为浏览器识别的内容
from pyquery import PyQuery  # 用于解析页面
import time
import pandas as pd
import io
import sys
# sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030')  # 改变标准输出的默认编码
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')  # 改变标准输出的默认编码

KEYWORD = 'iPad'

chrome_option = webdriver.ChromeOptions()
p = r'C:\Users\admin\AppData\Local\Google\Chrome\User Data'
chrome_option.add_argument('--user-data-dir='+p)
browser = webdriver.Chrome(options=chrome_option)
wait = WebDriverWait(browser, 10)

# 设置位置和宽高
# browser.set_window_position(x=1000, y=353)
# browser.set_window_size(width=900, height=500)
# 拦截webdriver检测代码
browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """
              Object.defineProperty(navigator, 'webdriver', {
              get: () => undefined
              })
              """})

# browser = webdriver.Chrome(r'D:\software\install package\Chrome\chromedriver.exe')
# wait = WebDriverWait(browser, 10)


# 爬取第n页面（所有页面）
def crawl_page(page):
    try:
        url = 'https://s.taobao.com/search?q=' + quote(KEYWORD)
        browser.get(url)
        print('正在爬取页面……')
        time.sleep(10)  # 睡眠几秒，用于手机扫码

        # 实现翻页功能
        if page > 1:
            # 判断可显示
            page_box = wait.until(ec.presence_of_all_elements_located((By.CSS_SELECTOR, '.input.J_Input')))
            # 判断可点击
            click_button = wait.until(ec.element_to_be_clickable((By.CSS_SELECTOR, '.btn.J_Submit')))
            page_box.clear()
            page_box.send_keys(page)
            click_button.click()

        # 等待一定的时间（时间为之前设置wait的时间10s）,直到通过CSS选择器能在页面找到某个元素
        # 如果超时还没有找到就继续向后执行
        # wait.until(
        #     ec.text_to_be_present_in_element((By.CSS_SELECTOR, '#mainsrp-pager li.item.active > span'), str(page)))
        wait.until(
            ec.presence_of_all_elements_located(
                (By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')
            )
        )
        res = get_products()
        return res
    except Exception as e:
        # print(e)
        crawl_page(page)


# 爬取商品
def get_products():
    res = []
    print('正在解析商品……')
    html = browser.page_source  # 获取网页源代码
    doc = PyQuery(html)  # 解析网页源代码
    items = doc('#mainsrp-itemlist .items .item').items()  # 定位所有商品
    for item in items:
        print('正在获取商品详请……')
        product = {
            'title': item.find('.title').text(),  # #mainsrp-itemlist .items .item .title a span
            'shop': item.find('.shop').text(),
            'location': item.find('.location').text(),
            'image': item.find('.img').attr('src'),
            'price': item.find('.price').text(),
            'deal': item.find('.deal-cnt').text()
        }
        res.append(product)
    # 如果程序未跑通，可在这里直接将获取的结果res写入到taobao.csv文件中
    return res


def save_date(res):
    df = pd.DataFrame(res)
    # df['title'] = df['title'].str.replace('\n', '').str.replace('【', '').str.replace('】', '').str.replace('[','').str.replace(']', '').str.replace('/', '')
    df.to_csv('taobao_new.csv')


if __name__ == '__main__':
    res = crawl_page(1)  # 爬取当前第一页
    print(res)
    save_date(res)





